﻿#ifndef _COMMON_H_INCLUDE_
#define _COMMON_H_INCLUDE_

#include <wx/wx.h>
#include <wx/dir.h>
#include <wx/icon.h>
#include <wx/filename.h>
#include <wx/wfstream.h>
#include <wx/zipstrm.h>
#include <wx/stdpaths.h>
#include <wx/filefn.h>
#include <wx/log.h>
#include <wx/buffer.h>
#include <wx/mstream.h>
#include <wx/file.h>
#include <wx/ffile.h>
#include <wx/thread.h>
#include <wx/tokenzr.h>
#include <wx/glcanvas.h>
#include <wx/aui/aui.h>
#include <wx/aui/auibook.h>
#include <wx/timer.h>
#include <wx/textctrl.h>
#include <wx/thread.h>
#include <wx/stc/stc.h>
#include <wx/richtext/richtextctrl.h>
#include <wx/datetime.h>
#include <wx/geometry.h>
#include <wx/filefn.h>
#include <wx/artprov.h>
#include <wx/toolbar.h>
#include <wx/event.h>
#include <wx/geometry.h>
#include <wx/gdicmn.h>
#include <wx/hash.h>
#include <wx/regex.h>
#include <GL/gl.h>
//#include <GL/glext.h>   // OpenGL 扩展

#include "wx/richtext/richtextctrl.h"
#include "wx/richtext/richtextctrl.h"
#include "wx/richtext/richtextstyles.h"
#include "wx/richtext/richtextxml.h"
#include "wx/richtext/richtexthtml.h"
#include "wx/richtext/richtextformatdlg.h"
#include "wx/richtext/richtextsymboldlg.h"
#include "wx/richtext/richtextstyledlg.h"
#include "wx/richtext/richtextprint.h"
#include "wx/richtext/richtextimagedlg.h"

#include "singleton.h"
#include "NedAllocatorImpl.h"
#include "NedAllocatedObject.h"
//#include "wxpolygonex.h"
#include "efsw/efsw.hpp"
#include "log4z.h"
#include "luabridge/lua-5.4.7/lua.hpp"
#include "luabridge/LuaBridge.h"
#include "scriptmanager.h"
#include "maindrawscene.h"
#include "scripteditor.h"

#include <vector>
#include <list>
#include <memory>

#define IDD_APPLICTION_NAME                      "信号控制系统"                // 应用标题
#define IDD_APPLICTION_VERSION                   "v1.0.13(20250819)"       // 应用版本
#define IDD_APPLICTION_DESCRIPTION               "用于监测、管理和控制信号设备（如交通灯、道闸等），\n通过自动化调节信号状态，确保设备安全运行并优化流程效率，\n广泛应用于交通、工业等领域。"
#define IDD_APPLICTION_WIDTH                     1024
#define IDD_APPLICTION_HEIGHT                    768
#define IDD_INIT_SYSTEM_SCRIPT_FILE              "系统初始.lua"     // 系统初始脚本文件名称
#define IDD_STATION_CONFIG_SCRIPT_FILE           "站场配置.lua"     // 站场配置脚本文件名称
#define IDD_LOCO_TWO_SPACE                       10               // 两边空隙
#define IDD_LOCO_BOTTOM_SPACE                    5                // 下边空隙
#define IDD_LOCO_SPACE                           3                // 机车之间的空隙
#define IDD_LOCO_LENGTH                          60               // 正常的机车长度
#define IDD_TRACK_BOUNDINGBOX_SIZE               6                // 轨道的包围盒大小

#define IDD_NETWORK_MSG_HEART                    1001             // 心跳消息
#define IDD_NETWORK_MSG_SIGNAL_COLLECT           1002             // 信号采集消息
#define IDD_NETWORK_MSG_SIGNAL_CONTROL           1003             // 信号控制消息
#define IDD_NETWORK_MSG_SIGNAL_CONTROLRETURN     1004             // 信号控制回复消息

#define IDD_NOTEBOOKPROCONTENT                   10000              // 管理所有的脚本文件
#define IDD_BUTTON_SAVEALL                       10001              // 保存所有的文件
#define IDD_FILEMENU_SYSTEMINIT                  10002              // 菜单 - 打开系统初始文件
#define IDD_FILEMENU_STATIONCONFIG               10003              // 菜单 - 打开站场配置文件
#define IDD_FILEMENU_SCENEDRAW                   10004              // 菜单 - 打开主场景绘制文件
#define IDD_FILEMENU_SCENEEVENT                  10005              // 菜单 - 打开主场景事件处理文件
#define IDD_FILEMENU_SCENEMESEVENT               10006              // 菜单 - 打开主场景消息事件处理文件
#define IDD_FIELMENU_NODEFILE                    10007              // 菜单 - 打开结点文件

#define IDD_MENU_STATIONPARAMSET                 20001              // 菜单 - 站场参数设置
#define IDD_MENU_SERVERSET                       20002              // 菜单 - 服务器设置
#define IDD_MENU_ABOAT                           20003              // 帮助 - 关于选项
#define IDD_MENU_LOADPROJECT                     20004              // 菜单 - 导入项目
#define IDD_MENU_SAVEPROJECT                     20005              // 菜单 - 保存项目
#define IDD_MENU_EXIT                            20006              // 菜单 - 退出应用程序
#define IDD_MENU_CREATNEWPROJECT                 20007              // 菜单 - 建立新项目

#define IDD_PARAMEDIT_DELETENODE                 30001              // 结点编辑 - 删除结点
#define IDD_PARAMEDIT_ADD_MOUNTNODE              30002              // 结点编辑 - 添加挂结点
#define IDD_PARAMEDIT_ADD_SIGNALLAMP             30003              // 结点编辑 - 添加信号灯
#define IDD_PARAMEDIT_ADD_SWITCH                 30004              // 结点编辑 - 添加道岔

#define IDD_MOUNTPOINT_WIDTH                     20                 // 挂接点的显示宽度
#define IDD_MOUNTPOINT_HEIGHT                    20                 // 挂接点的显示高度
#define IDD_SIGNALLAMP_RADIUS                    10                 // 信号灯显示半径
#define IDD_SWITCHRECT_SIZE                      20                 // 信号灯显示高宽

#define ENABLE_TCMALLOC 1

// 对齐选项（仅左右）
enum class TextAlignment {
    LEFT,    // 文本在 pos 的左侧(向左延伸)
    RIGHT,   // 文本在 pos 的右侧(向右延伸)
    CENTER
};

// 信号灯选排进路类型
enum SLRouteType
{
    ROUTE_LEFT = 0,         // 带左边轨道
    ROUTE_RIGHT,            // 带右边轨道
    ROUTE_NULL              // 两边都不带
};

// 区段进出规则
enum SectAccessRule
{
    ACCESS_ENTER = 0,       // 进
    ACCESS_EXIT,            // 出
    ACCESS_ENTERANDEXIT,    // 进出
    ACCESS_BERTH,           // 停靠
    ACCESS_NULL
};

struct tagSwitchRoute
{
    tagSwitchRoute(){}
    tagSwitchRoute(wxString sp,wxString ep)
        : startPos(sp),endPos(ep) {}

    wxString startPos;
    wxString endPos;
};

#pragma pack(push,1)
struct tagMsgHearder
{
    tagMsgHearder()
        :srcLength(0),compLength(0),checknum(0),msgType(0) {}

    char mark[3];         // 'S','I','G'
    uint16_t checknum;    // 校验码
    int srcLength;        // 原始长度
    int compLength;       // 压缩后长度
    int msgType;          // 消息类型
};
#pragma pack(pop)

struct tagTimerItem : public NedAllocatedObject
{
    tagTimerItem()
        : runCount(0),interval(1),starttime(0) {}
    tagTimerItem(wxString pname,int pruncount,int pinterval,
                 luabridge::LuaRef pcallback)
        : name(pname),runCount(pruncount),interval(pinterval),
        callback(std::make_shared<luabridge::LuaRef>(pcallback)),
        starttime(0) {}

    wxString name;        // 定时器名称
    int runCount;         // 执行次数：0-无限
    int interval;         // 时间间隔，以秒为单位
    int starttime;        // 开始时间
    std::shared_ptr<luabridge::LuaRef> callback;  // 回调函数
};

using namespace zsummer::log4z;

extern efsw::FileWatcher m_fileWatcher;

/// 得到指定目录下所有的文件路径
bool ListFilesInDirectory(const wxString& dirPath,wxVector<wxString>& decPaths);
/// 读取指定的文件到内存中
bool ReadFileToMemoryBuffer(const wxString& filePath, wxMemoryBuffer& buffer);
// 递归删除目录下的所有文件和子目录
bool DeleteDirectoryRecursive(const wxString& dirPath);
// 删除指定目录下的所有文件（不递归删除子目录）
bool DeleteAllFilesInDir(const wxString& dirPath,std::vector<wxString> files=std::vector<wxString>());
// 计算两点角度（0°~360°，以 P1 为原点，P2 为终点）
double CalculateAngle(const wxPoint& p1, const wxPoint& p2);
wxRealPoint GetInterpolatedPoint(const wxRealPoint& p1, const wxRealPoint& p2, double ratio);
wxArrayString SplitString(const wxString& s, const wxString& delimiter);
std::vector<std::string> SplitString2(const std::string& str, char delimiter);
wxUint16 qChecksum(const char* data, size_t len);
// 压缩数据（使用 FastLZ）
wxMemoryBuffer CompressWithFastLZ(const void* data, size_t dataLen);
wxMemoryBuffer DecompressWithFastLZ(const void* compressedData, size_t compressedLen, size_t originalLen);
/// 得到指定文件内容的md5
wxString getFileContentMd5(const wxString& filePath);

bool IsFloatColonFloatFormatRegex(const wxString& str);
wxVector<double> getFloatColonFloatFormat(const wxString& str);
wxArrayString CreateChoiceArray(const std::vector<wxString>& items);
void RemoveDataFromMemoryBuffer(wxMemoryBuffer& buffer,size_t pos, size_t len);

wxString GB2312ToUTF8(const wxString& gb2312Text);
wxString UTF8ToGB2312(const wxString& utf8Text);

#endif
